查看原文
其他

一道腾讯面试题,击败100%的用户,合并排序链表

IT服务圈儿 2022-09-11

The following article is from 小夕学算法 Author 小夕

作者丨小夕

来源丨公众号:小夕学算法(ID:gh_a73f3afde197)

题目

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

示例1:

输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 限制:

0 <= 链表长度 <= 1000

注意:本题与主站 21 题相同:https://leetcode-cn.com/problems/merge-two-sorted-lists/

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

文字思路

  • 设置dummy为哑结点,放置于新链表之前,最后返回的就是dummy.next;设置cur为当前节点,从dummy开始
  • 当两个链表都非空时进入循环,令新链表的下一个节点cur.next为val更小的节点,相应的链表节点后移一位
  • 每次循环记得cur也要后移一位
  • 如果循环结束后还有链表非空,cur指向非空链表
  • 返回dummy.next

图解思路

上述图片中的文字:

  • 创建一个伪头结点 tempHead 节点 cur 指向 tempHead 节点 接下来比较 head1 和 head2 两个链表 哪个节点小 就把 tempHead 指向谁
  • head1.val >= head2.val 所以 head2 节点是值较小的,让cur.next指向head2节点
  • cur.next指向了head2,如图所示,接着让head2 = head2.next,让head2 继续参与接下来的比较。
  • 完成了cur.next 指向了head2,head2 = head2.next,接下来让 cur指向下一个节点 cur = cur.next
  • 完成了cur.next指向了head2,head2 = head2.next,cur = cur.next变成了如图所示。
  • 接着继续重复上述过程 继续比较 head1.val < head2.val
  • 由于 head1.val < head2.val 继续执行之前的三步:cur.next = head1 head1 = head1.next cur = cur.next
  • 由于 head1.val < head2.val 继续执行之前的三步:cur.next = head1 head1 = head1.next cur = cur.next 执行完这三步以后,如图所示。
  • 接下来继续比较head1.val和head2.val 因为 head1.val < head2.val 继续执行之前的三步:cur.next = head1 head1 = head1.next cur = cur.next
  • cur.next = head1 head1 = head1.next cur = cur.next如图所示
  • 接下来继续比较head1.val和 head2.val 因为 head1.val > head2.val:所以执行 cur.next = head2 head2 = head2.next cur = cur.next
  • 接下来继续比较head1.val和 head2.val 因为 head1.val >= head2.val:所以继续执行 cur.next = head2 head2 = head2.next cur = cur.next
  • 执行完如图所示,head1指向了null,所以排序列表一遍历结束了,所以把排序列表二接到合并排序列表后面。
  • 接到后面,cur.next = head2 完成全部排序。
  • 由于需要返回1-1-2-3-4-4 所以最后返回tempHead.next 节点

动画


本文原创作者:小夕,一名BAT大厂程序媛。
文章首发平台:微信公众号【小夕学算法】。

1、一键生成数据库文档,堪称数据库界的Swagger

2、iOS重磅新功能:将远程扫描用户相册检测违规照片

3、Chrome 92 破坏性功能,我这弹窗有何用?

4、美团面试:接口被恶意狂刷,怎么办?

点分享

点点赞

点在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存